#include "gbser.h"
#include "gbfile.h" /* used for csv output */
#include <ctype.h>
+#include <errno.h>
#define MYNAME "mtk_logger"
int id;
int size;
const char *name;
-} log_type[] = {
+} log_type[32] = {
{ 0, 4, "UTC" },
{ 1, 2, "VALID" },
{ 2, 8, "LATITUDE,N/S"},
{ 16, 2, "SNR"},
{ 17, 2, "RCR"},
{ 18, 2, "MILLISECOND"},
- { 19, 8, "DISTANCE" }
+ { 19, 8, "DISTANCE" },
+ { 20, 0, NULL},
};
struct sat_info {
static FILE *fl; /* bin.file fd */
static char *port; /* serial port name */
static char *OPT_erase; /* erase ? command option */
+static char *OPT_erase_only; /* erase_only ? command option */
static char *OPT_log_enable; /* enable ? command option */
static char *csv_file; /* csv ? command option */
static enum MTK_DEVICE_TYPE mtk_device = MTK_LOGGER;
static arglist_t mtk_sargs[] = {
{ "erase", &OPT_erase, "Erase device data after download",
"0", ARGTYPE_BOOL, ARG_NOMINMAX },
+ { "erase_only", &OPT_erase_only, "Only erase device data, do not download anything",
+ "0", ARGTYPE_BOOL, ARG_NOMINMAX },
{ "log_enable", &OPT_log_enable, "Enable logging after download",
"0", ARGTYPE_BOOL, ARG_NOMINMAX },
{ "csv", &csv_file, "MTK compatible CSV output file",
int rc;
port = xstrdup(fname);
-
+
+ errno = 0;
dbg(1, "Opening port %s...\n", fname);
if ( (fd = gbser_init(port)) == NULL ) {
- fatal(MYNAME ": Can't initialise port \"%s\"\n", port);
+ fatal(MYNAME ": Can't initialise port \"%s\" (%s)\n", port, strerror(errno));
}
// verify that we have a MTK based logger...
FILE *dout;
char *fusage = NULL;
+
+ if ( *OPT_erase_only != '0' ) {
+ mtk_erase();
+ return;
+ }
+
log_enabled = 0;
init_scan = 0;
dout = fopen(TEMP_DATA_BIN, "r+b");
len = 0;
}
}
- }
+ } else if ( strncmp(line, "$PMTK001,182,7,", 15) == 0 ){ // Command ACK
+ if ( line[15] != '3' ) {
+ // fixme - we should timeout here when no log data has been received...
+ dbg(2, "\nLog req. failed (%c)\n", line[15]);
+ gb_sleep(10*1000);
+ retry_cnt++;
+ goto mtk_retry;
+ }
+ }
}
} while ( len != 0 );
if ( init_scan ){
}
} else {
addr += bsize;
- if ( global_opts.verbose_status || global_opts.debug_level >= 2 ){
+ if ( global_opts.verbose_status || (global_opts.debug_level >= 2 && global_opts.debug_level < 5) ){
int perc;
perc = 100 - 100*(addr_max-addr)/addr_max;
if ( addr >= addr_max )
}
if ( dout != NULL )
fclose(dout);
- if ( global_opts.verbose_status || global_opts.debug_level >= 2 )
+ if ( global_opts.verbose_status || (global_opts.debug_level >= 2 && global_opts.debug_level < 5) )
fprintf(stderr,"\n");
// Fixme - Order or. Enable - parse - erase ??
} /* for (bmap,...) */
if ( mtk_device == MTK_LOGGER ){ // Holux skips '*' checksum separator
- if ( data[i] == '*' )
+ if ( data[i] == '*' ){
i++; // skip '*' separator
- else
- dbg(1,"Missing '*' !\n");
+ } else {
+ dbg(1,"Missing '*' !\n");
+ if ( data[i] == 0xff ){ // in some case star-crc hasn't been written on power off.
+ dbg(1, "Bad data point @0x%.6x - skip %d bytes\n", (fl!=NULL)?ftell(fl):-1, i+2);
+ return i+2; // include '*' and crc
+ }
+ }
}
if ( memcmp(&data[0], &LOG_RST[0], 6) == 0
&& memcmp(&data[12], &LOG_RST[12], 4) == 0 )
int i, len;
/* calculate the length of a binary log item. */
- len = 2; // add '*' + crc, holux would only be +1, oh, well...
+ switch ( mtk_device ){
+ case HOLUX_M241:
+ case HOLUX_GR245:
+ len = 1; // add crc
+ break;
+ case MTK_LOGGER:
+ default:
+ len = 2; // add '*' + crc
+ break;
+ }
for (i=0;i<32;i++){
if ( (1<<i) & bitmask ){
if ( i > DISTANCE )
- fprintf(stderr, "WARNING: Unknown size/meaning of bit %d\n", i);
+ warning(MYNAME ": Unknown size/meaning of bit %d\n", i);
if ( (i == SID || i == ELEVATION || i == AZIMUTH || i == SNR) && (1<<SID) & bitmask )
len += log_type[i].size*32; // worst case, max sat. count..
else
if ( mtk_device != MTK_LOGGER ) { // clear Holux-specific 'low precision' bit
mask &= 0x7fffffffU;
}
- if ( mask & HOLUX245_MASK ){
- // Holux245 semibroken device..
- mtk_device = HOLUX_GR245;
- holux245_init();
- mask &= ~HOLUX245_MASK;
- }
-
log_period = le_read32(buf + 8);
log_distance = le_read32(buf + 12);
log_speed = le_read32(buf + 16);
mtk_info.speed = log_speed;
}
mtk_info.track_event = 0;
-
+
pos = 0x200; // skip header...first data position
fseek(fl, pos, SEEK_SET);
-
+
/* read initial info blocks -- if any */
do {
bLen = fread(buf, 1, 16, fl);
k = 16;
} else if ( is_holux_string(&buf[i], (bLen - i)) ) {
k = 16;
- // HOLUXGR245LOGGER<SP><SP><SP><SP> or HOLUXGR245WAYPNT<SP><SP><SP><SP>
- if ( memcmp(&buf[i+16], " ", 4) == 0 ) // Assume loglen >= 20...
+ // m241 - HOLUXGR241LOGGER or HOLUXGR241WAYPNT
+ // gr245 - HOLUXGR245LOGGER<SP><SP><SP><SP> or HOLUXGR245WAYPNT<SP><SP><SP><SP>
+ if ( memcmp(&buf[i+16], " ", 4) == 0 ){ // Assume loglen >= 20...
+ if ( mtk_device != HOLUX_GR245 ){
+ dbg(2, "Detected Holux GR245 !\n");
+ holux245_init();
+ }
k += 4;
+ }
} else if ( buf[i] == 0xff && buf[i+1] == 0xff && buf[i+2] == 0xff && buf[i+3] == 0xff
- /* && (pos + 2*logLen) & 0xffff) < logLen */)
+ /* && ((pos + 2*mtk_info.logLen) & 0xffff) < mtk_info.logLen */ )
{
/* End of 64k block segment -- realign to next data area */